/**

 * ZHU framework. Copyright 2012-, all rights reserved.
 *
 * $Id: SessionBean.java 46 2012-09-19 09:10:23Z zhuxiaopeng $
 * $Revision: 46 $
 * $Date: 2012-09-19 17:10:23 +0800 (三, 2012-09-19) $
 * $Author: zhuxiaopeng $
 */
package daily.web;

import java.util.*;

import javax.annotation.*;
import javax.ejb.*;
import javax.enterprise.context.*;
import javax.faces.model.*;
import javax.inject.*;

import daily.entity.*;
import daily.service.*;

/**
 * <p>
 * </p>
 * 
 * @author $Author: zhuxiaopeng $
 * @version $Revision: 46 $ - $Date: 2012-09-19 17:10:23 +0800 (三, 2012-09-19) $
 */
@Named
@SessionScoped
public class SessionBean implements java.io.Serializable {

	/**
	 * <h3>スレッドセーフ性</h3>
	 * <p>
	 * この変数は<code>this</code>によってGuardされる。 この変数は<code>final</code>
	 * であり、参照先がスレッドセーフであるため、スレッドセーフ性を破ることはない。
	 * この変数の参照先はスレッドセーフ<strong>ではない</strong>。
	 * </p>
	 */
	private static final long serialVersionUID = 1L;

	@PostConstruct
	private void init() {
		staffList = initialService.getStaffList();
	}

	/**
	 * <p>
	 * プロパティ<code>loginStaff</code>の値を取得する。
	 * </p>
	 * 
	 * @return プロパティ<code>loginStaff</code>の値
	 */
	public synchronized Staff getLoginStaff() {
		return loginStaff;
	}

	/**
	 * <p>
	 * プロパティ<code>loginStaff</code>の値を設定する。
	 * </p>
	 * 
	 * @param loginStaff
	 *            プロパティ<code>loginStaff</code>に設定する値
	 */
	public synchronized void setLoginStaff(final Staff loginStaff) {
		this.loginStaff = loginStaff;
		loginStaffIndex = staffList.indexOf(loginStaff);
	}

	/**
	 * <p>
	 * プロパティ<code>menuList</code>の値を取得する。
	 * </p>
	 * 
	 * @return プロパティ<code>menuList</code>の値
	 */
	public synchronized List<Menu> getMenuList() {
		return menuList;
	}

	/**
	 * <p>
	 * プロパティ<code>menuList</code>の値を設定する。
	 * </p>
	 * 
	 * @param menuList
	 *            プロパティ<code>menuList</code>に設定する値
	 */
	public synchronized void setMenuList(final List<Menu> menuList) {
		this.menuList = menuList;
		if (menuList != null && menuList.isEmpty() == false) {
			selectedMenu = menuList.get(0);
		}
	}

	/**
	 * <p>
	 * プロパティ<code>selectedMenu</code>の値を取得する。
	 * </p>
	 * 
	 * @return プロパティ<code>selectedMenu</code>の値
	 */
	public synchronized Menu getSelectedMenu() {
		return selectedMenu;
	}

	/**
	 * <p>
	 * プロパティ<code>selectedMenu</code>の値を設定する。
	 * </p>
	 * 
	 * @param selectedMenu
	 *            プロパティ<code>selectedMenu</code>に設定する値
	 */
	public synchronized void setSelectedMenu(final Menu selectedMenu) {
		this.selectedMenu = selectedMenu;
	}

	public synchronized List<SelectItem> getStaffMenus() {
		final List<SelectItem> ret = new ArrayList<>();
		for (final Staff satff : staffList) {
			ret.add(new SelectItem(satff, satff.getFormalName()));
		}
		return ret;
	}

	/**
	 * <p>
	 * プロパティ<code>staffList</code>の値を取得する。
	 * </p>
	 * 
	 * @return プロパティ<code>staffList</code>の値
	 */
	public synchronized List<Staff> getStaffList() {
		return staffList;
	}

	/**
	 * 
	 * @return
	 */
	public synchronized int getSelectMenuIndex() {
		return menuList.indexOf(selectedMenu);
	}

	/**
	 * @return the loginStaffIndex
	 */
	public synchronized int getLoginStaffIndex() {
		return loginStaffIndex;
	}

	/**
	 * @param loginStaffIndex
	 *            the loginStaffIndex to set
	 */
	public synchronized void setLoginStaffIndex(final int loginStaffIndex) {
		this.loginStaffIndex = loginStaffIndex;
	}

	private Staff loginStaff;

	private List<Menu> menuList;

	private Menu selectedMenu;

	private List<Staff> staffList;

	private int loginStaffIndex;

	@EJB
	private InitialServiceImpl initialService;
}
